﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using GestionComercial.Model.Entities;
using GestionComercial.Utils;
using GestionComercial.Data;

namespace GestionComercial.WinUI.Stock
{
    public partial class frmArticuloEdit : Form
    {
        private ArticuloData articuloData = new ArticuloData();
        private RubroData rubroData = new RubroData();
        private MarcaData marcaData = new MarcaData();

        private List<Marca> listaMarcas;
        private List<Rubro> listaRubros;

        public Operaciones operacion {get;set;}

        public Articulo articulo { get; set; }

        public OperationResult result;

        public frmArticuloEdit()
        {
            InitializeComponent();
            
        }
        private void frmClienteEdit_Load(object sender, EventArgs e){
            CargarColores();
            InicializarControles();
            if (operacion == Operaciones.EDIT)
                MostrarRegistro();
                
        }
        private void CargarColores()
        {
            panelHeader.BackColor = Constantes.BACK_COLOR_FORM_HEADER;
            panelTool.BackColor = Constantes.BACK_COLOR_FORM_PANEL;

            lblHeader.ForeColor = Constantes.FORE_COLOR_FORM_LABEL;
        }
        private void MostrarRegistro()
        {
            if (articulo != null)
            {
                chkControlarStock.Checked = (bool)articulo.ControlarStock;
                txtCodigoBarra.Text = articulo.CodigoBarra;
                txtCodigo.Text = articulo.Codigo;
                txtNombreProducto.Text = articulo.NombreArticulo;
                txtPrecioCosto.Text = articulo.PrecioCosto.ToString();
                txtMargenGanancia.Text = articulo.MargenGanancia.ToString();
                txtPrecioVenta.Text = articulo.PrecioVenta.ToString();
                if (articulo.Rubro != null)
                    cmbMarca.SelectedItem = articulo.Rubro;

                if (articulo.Marca != null)
                    cmbMarca.SelectedItem = articulo.Marca;
                txtStockInicial.Text = articulo.Stock.StockInicial.ToString();
                txtStockMinimo.Text = articulo.Stock.StockMinimo.ToString();
            }
        }
        private void InicializarControles()
        {
            listaMarcas = marcaData.CargarTodos();

            cmbMarca.DataSource = listaMarcas;
            cmbMarca.DisplayMember = "NombreMarca";
            cmbMarca.ValueMember = "IdMarca";

            listaRubros = rubroData.CargarTodos();
            cmbRubro.DataSource = listaRubros;
            cmbRubro.DisplayMember = "NombreRubro";
        }
        public void Guardar()
        {
            Decimal tmp;
            if (operacion == Operaciones.ADD)
                articulo = new Articulo();
            if (txtCodigo.Text == "")
            {
                MessageBox.Show("Codigo Inválido", "Atención", MessageBoxButtons.OK);
                return;
            }
            if (txtNombreProducto.Text == "")
            {
                MessageBox.Show("Nombre Inválido", "Atención", MessageBoxButtons.OK);
                return;
            }
            if (!(Decimal.TryParse(txtPrecioCosto.Text, out tmp)))
            {
                MessageBox.Show("Precio Costo Inválido", "Atención", MessageBoxButtons.OK);
                return;
            }
            if (!(Decimal.TryParse(txtMargenGanancia.Text, out tmp)))
            {
                MessageBox.Show("Margen Ganancia Inválido", "Atención", MessageBoxButtons.OK);
                return;
            }
            if (!(Decimal.TryParse(txtPrecioVenta.Text, out tmp)))
            {
                MessageBox.Show("Precio Venta Inválido", "Atención", MessageBoxButtons.OK);
                return;
            }
            if (chkControlarStock.Checked)
            {
                if (!(Decimal.TryParse(txtStockInicial.Text, out tmp)))
                {
                    MessageBox.Show("Stock Inicial Inválido", "Atención", MessageBoxButtons.OK);
                    return;
                }
                if (!(Decimal.TryParse(txtStockMinimo.Text, out tmp)))
                {
                    MessageBox.Show("Stock Inicial Inválido", "Atención", MessageBoxButtons.OK);
                    return;
                }

                
            }

            articulo.Codigo = txtCodigo.Text;
            articulo.CodigoBarra = txtCodigoBarra.Text;
            articulo.NombreArticulo = txtNombreProducto.Text;
            articulo.PrecioCosto = Decimal.Parse(txtPrecioCosto.Text);
            articulo.MargenGanancia = Decimal.Parse(txtMargenGanancia.Text);
            articulo.PrecioVenta = Decimal.Parse(txtPrecioVenta.Text);
            articulo.IdRubro = ((Rubro)cmbRubro.SelectedItem).IdRubro;
            articulo.Rubro = (Rubro)cmbRubro.SelectedItem;
            articulo.IdMarca = ((Marca)cmbMarca.SelectedItem).IdMarca;
            articulo.Marca = (Marca)cmbMarca.SelectedItem;
            articulo.Talle = txtTalle.Text;
            articulo.ControlarStock = chkControlarStock.Checked;
            GestionComercial.Model.Entities.Stock stock = new GestionComercial.Model.Entities.Stock();
            if (chkControlarStock.Checked)
            {
                
                stock.StockActual = decimal.Parse(txtStockInicial.Text);
                stock.StockInicial = decimal.Parse(txtStockInicial.Text);
                stock.StockMinimo = decimal.Parse(txtStockMinimo.Text);
            }

            result = articuloData.Guardar(articulo, stock);
            if (result.Success)
            {
                MessageBox.Show("Operación Exitosa", "Atención", MessageBoxButtons.OK);
                LimpiarControles();
            }
            else
                MessageBox.Show(result.Msg, "Atención", MessageBoxButtons.OK);
            if (operacion == Operaciones.EDIT)
                this.Close();
        }
        private void LimpiarControles()
        {
            txtCodigo.Text = "";
            txtCodigoBarra.Text = "";
            txtNombreProducto.Text = "";
            txtPrecioCosto.Text = "";
            txtMargenGanancia.Text = "";
            txtPrecioVenta.Text = "";
            txtTalle.Text = "";
        }
        
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            Guardar();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void frmClienteEdit_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
                this.Close();
        }

        private void txtApellido_TextChanged(object sender, EventArgs e)
        {

        }

        private void cmbRubro_SelectedIndexChanged(object sender, EventArgs e)
        {
            lblTalle.Visible = ((Rubro)cmbRubro.SelectedItem).IncluyeTalle;
            txtTalle.Visible = ((Rubro)cmbRubro.SelectedItem).IncluyeTalle;
        }

        private void chkControlarStock_CheckedChanged(object sender, EventArgs e)
        {
            if (chkControlarStock.Checked)
                MostrarControlesStock();
            else {
                OcultarControlesSotck();
            }
        }

        private void MostrarControlesStock() {
            lblStrockInicial.Visible = true;
            lblStockMinimo.Visible = true;
            txtStockInicial.Visible = true;
            txtStockMinimo.Visible = true;
        }

        private void OcultarControlesSotck() {
            lblStrockInicial.Visible = false;
            lblStockMinimo.Visible = false;
            txtStockInicial.Visible = false;
            txtStockMinimo.Visible = false;
        }


    }
}
